package com.example.thread.demo;

import sun.security.krb5.internal.Ticket;

//售票案例
public class Threads {
    public static void main(String[] args) {
        //只创建一次，就100张票
        Ticket2 t = new Ticket2();

        //for循环里就不止4个线程了
//        for (int i = 0; i < 4; i++) {
            Thread target = new Thread(t, "窗口1:");
            Thread target2 = new Thread(t, "窗口2:");
            Thread target3 = new Thread(t, "窗口3:");
            Thread target4 = new Thread(t, "窗口4:");
        //4个线程共同作用一个target

            target.start();
            target2.start();
            target3.start();
            target4.start();
//        }


    }

}

class Ticket2 implements Runnable {
    //总票数，多个线程共享这个变量，能修改 ticket–
    private int tickets = 100;

    //执行业务，重写父类run方法
    @Override
    public void run() {
        //业务处理，卖票：票–
        while (true) {  //线程非常多，我想尽量给我资源
            // 把有线程安全问题的代码，用同步关键字包起来
            // 原理：用一个对象作为一把锁，给代码上锁，一个线程访问锁代码时，其他线程只能等待锁释放才能进来。
            // 多线程间要使用同一把锁才可以真的把代码锁住实现线程安全。
// synchronized (new Object()) {//锁了不同对象
            // synchronized (obj) {//锁了同一个对象
//synchronized (Ticket2.class) {//锁了本类，针对于静态
            synchronized (this) {//对象锁
                //判断一个条件，出去条件
                if (tickets > 0) {   //多线程可能ticket=-1
                    try {
                        //t t2 t3 t4都睡了
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + tickets--);
                }
            }
        }
    }
}